package producto;

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

public class PedidoTest {
	
	Pedido miPedido01 = new Pedido();
	Producto productoMock01 = mock(Producto.class);
	Producto productoMock02 = mock(Producto.class);
	
	@Before
	public void setUp(){
		
		when(productoMock01.precioUnitarioDeVenta()).thenReturn((double) 10);
		when(productoMock02.precioUnitarioDeVenta()).thenReturn((double) 20);
		when(productoMock01.getCantidadEnStock()).thenReturn(5,4,3,2,1,0);
		when(productoMock02.getCantidadEnStock()).thenReturn(0);
		when(productoMock01.duplicar()).thenReturn(productoMock01);
		when(productoMock02.duplicar()).thenReturn(productoMock02);
		miPedido01.agregar(productoMock01);
		miPedido01.agregar(productoMock02);
	}

	@Test
	public void testAgregarProducto() {
	
		assertEquals(2,miPedido01.getListaDeProductos().size());
	}
	
	@Test
	public void testPrecioDeVentaTotal(){
		assertEquals((double)30,miPedido01.precioDeVentaTotal(),.01);
	}
	
	@Test
	public void testDescontarStock(){
		miPedido01.descontarStock();
		verify(productoMock01, times(1)).decrementarStock();
		verify(productoMock02, times(1)).decrementarStock();
	}
	
	@Test
	public void testGetListaDeProductos(){
		List<Producto> lista = new ArrayList<Producto>();
		lista.add(productoMock01);
		lista.add(productoMock02);
		assertEquals(lista,miPedido01.getListaDeProductos());
	}
	
	@Test
	public void testRetornarProductos(){
		miPedido01.retornarProductos();
		verify(productoMock01, times(1)).incrementarStock();
		verify(productoMock02, times(1)).incrementarStock();
	}
	
	@Test
	public void testElementosSinStock(){
		assertTrue(miPedido01.elementosSinStock());
	}
	@Test
	public void testElementosSinStockFalse(){
		when(productoMock02.getCantidadEnStock()).thenReturn(1);
		assertFalse(miPedido01.elementosSinStock());
	}

}
